package model.dao;

import model.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import model.beans.Cliente;

/**
*
* @author Juliane
*/
public class ClienteDAO {

    private Connection con;
    private PreparedStatement stmtInserir;
    private PreparedStatement stmtAtualizar;
    private PreparedStatement stmtDeletar;    
    private PreparedStatement stmtListar;
    private PreparedStatement stmtListarC;
    private PreparedStatement stmtBuscar;
    private PreparedStatement stmtBuscaId;

    public ClienteDAO() throws Exception {
        con = ConnectionFactory.getConnection();   
    }

    public ClienteDAO(Connection con) throws Exception {
        this.con = con;
    }

    public void inserir(Cliente cliente) throws Exception {
        stmtInserir = con.prepareStatement("INSERT INTO cliente(nome, sexo, dataNasc, cpf, endereco, numero, complemento, bairro, cep, cidade, estado, telefone, email) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)");
        stmtInserir.setString(1, cliente.getNome());
        stmtInserir.setString(2, cliente.getSexo());
        stmtInserir.setDate(3, new java.sql.Date(cliente.getDataNasc().getTime()));
        stmtInserir.setString(4, cliente.getCpf());
        stmtInserir.setString(5, cliente.getEndereco());
        stmtInserir.setInt(6, cliente.getNumero());
        stmtInserir.setString(7, cliente.getComplemento());
        stmtInserir.setString(8, cliente.getBairro());
        stmtInserir.setString(9, cliente.getCep());
        stmtInserir.setString(10, cliente.getCidade());
        stmtInserir.setString(11, cliente.getEstado());
        stmtInserir.setString(12, cliente.getTelefone());
        stmtInserir.setString(13, cliente.getEmail());
        
        stmtInserir.executeUpdate();
    }
    
    public void atualizar(Cliente cliente) throws Exception{
        stmtAtualizar = con.prepareStatement("UPDATE cliente SET nome = ?, sexo = ?, dataNasc = ?, cpf = ?, endereco = ?, numero = ?, complemento = ?, bairro = ?, cep = ?, cidade = ?, estado = ?, telefone = ?, email = ?  WHERE idCliente = ?");
    	stmtAtualizar.setString(1, cliente.getNome());
        stmtAtualizar.setString(2, cliente.getSexo());
        stmtAtualizar.setDate(3, new java.sql.Date(cliente.getDataNasc().getTime()));
        stmtAtualizar.setString(4, cliente.getCpf());
        stmtAtualizar.setString(5, cliente.getEndereco());
        stmtAtualizar.setInt(6, cliente.getNumero());
        stmtAtualizar.setString(7, cliente.getComplemento());
        stmtAtualizar.setString(8, cliente.getBairro());
        stmtAtualizar.setString(9, cliente.getCep());
        stmtAtualizar.setString(10, cliente.getCidade());
        stmtAtualizar.setString(11, cliente.getEstado());
        stmtAtualizar.setString(12, cliente.getTelefone());
        stmtAtualizar.setString(13, cliente.getEmail());
        stmtAtualizar.setInt(14, cliente.getIdCliente());
        
    	stmtAtualizar.executeUpdate(); 
    }
    
    public void deletar(int idCliente) throws Exception{
        stmtDeletar = con.prepareStatement ("DELETE FROM cliente WHERE idCliente = ?");
        stmtDeletar.setInt(1, idCliente);
    	stmtDeletar.executeUpdate();
    }

    public List<Cliente> listarCombo() throws Exception {
       stmtListar = con.prepareStatement("SELECT idCliente, nome FROM cliente");
       ResultSet rs = stmtListar.executeQuery();
       List<Cliente> listaCliente = new ArrayList();
       while(rs.next()){
          Cliente cliente = new Cliente(rs.getInt("idCliente"),rs.getString("nome"));
          listaCliente.add(cliente);
       }
       return listaCliente;
    }
    
    public Cliente buscaCombo(int id) throws Exception {
       stmtListarC = con.prepareStatement("SELECT nome FROM cliente WHERE idCliente = ?");
       stmtListarC.setInt(1, id);
       
       ResultSet rs = stmtListarC.executeQuery();
       rs.next();
       Cliente cliente = new Cliente(id, rs.getString("nome"));
    
       return cliente;
    }
    
    public List<Cliente> listarTodos() throws Exception {
       stmtListar = con.prepareStatement("SELECT * FROM cliente");
       ResultSet rs = stmtListar.executeQuery();
       List<Cliente> listaCliente = new ArrayList();
       while(rs.next()){
          Cliente cliente = new Cliente();
          
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("nome"));
          cliente.setSexo(rs.getString("sexo")); 
          cliente.setDataNasc(rs.getDate("dataNasc"));
          cliente.setCpf(rs.getString("cpf"));
          cliente.setEndereco(rs.getString("endereco"));
          cliente.setNumero(rs.getInt("numero"));
          cliente.setComplemento(rs.getString("complemento"));
          cliente.setBairro(rs.getString("bairro"));
          cliente.setCep(rs.getString("cep"));
          cliente.setCidade(rs.getString("cidade"));
          cliente.setEstado(rs.getString("estado"));
          cliente.setTelefone(rs.getString("telefone"));
          cliente.setEmail(rs.getString("email"));
          listaCliente.add(cliente);
       }
       return listaCliente;
    }
    
    public List<Cliente> buscarCliente(String strBusca) throws Exception{
        stmtBuscar = con.prepareStatement("SELECT * FROM cliente where nome like ? or cpf like ? or email like ?");
        String str = "%" + strBusca + "%";
        stmtBuscar.setString(1, str);
        stmtBuscar.setString(2, str);
        stmtBuscar.setString(3, str);
        ResultSet rs = stmtBuscar.executeQuery();
        List<Cliente> listaCliente = new ArrayList();
        while(rs.next()){
            Cliente cliente = new Cliente();
            
            cliente.setIdCliente(rs.getInt("idCliente"));
            cliente.setNome(rs.getString("nome"));
            cliente.setSexo(rs.getString("sexo")); 
            cliente.setDataNasc(rs.getDate("dataNasc"));
            cliente.setCpf(rs.getString("cpf"));
            cliente.setEndereco(rs.getString("endereco"));
            cliente.setNumero(rs.getInt("numero"));
            cliente.setComplemento(rs.getString("complemento"));
            cliente.setBairro(rs.getString("bairro"));
            cliente.setCep(rs.getString("cep"));
            cliente.setCidade(rs.getString("cidade"));
            cliente.setEstado(rs.getString("estado"));
            cliente.setTelefone(rs.getString("telefone"));
            cliente.setEmail(rs.getString("email"));
            
            listaCliente.add(cliente);
        }
        return listaCliente;
    }
    
    public Cliente buscaId(int id) throws Exception{
        stmtBuscaId = con.prepareStatement("SELECT * FROM cliente WHERE idCliente = ?");
        stmtBuscaId.setInt(1, id);
        ResultSet rs = stmtBuscaId.executeQuery();
        Cliente cliente = new Cliente();
        if(rs.next()){
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("nome"));
          cliente.setSexo(rs.getString("sexo")); 
          cliente.setDataNasc(rs.getDate("dataNasc"));
          cliente.setCpf(rs.getString("cpf"));
          cliente.setEndereco(rs.getString("endereco"));
          cliente.setNumero(rs.getInt("numero"));
          cliente.setComplemento(rs.getString("complemento"));
          cliente.setBairro(rs.getString("bairro"));
          cliente.setCep(rs.getString("cep"));
          cliente.setCidade(rs.getString("cidade"));
          cliente.setEstado(rs.getString("estado"));
          cliente.setTelefone(rs.getString("telefone"));
          cliente.setEmail(rs.getString("email"));
        }
        return cliente;
    }
    
    @Override
    public void finalize() throws Throwable{
        super.finalize();
        stmtInserir.close();
        stmtListar.close();
        stmtListarC.close();
        stmtDeletar.close();
        stmtAtualizar.close();
        stmtBuscar.close();
        stmtBuscaId.close();
        con.close();
    }
}

